package com.example.redistest.ThreadDemo;

/**
 * sleep(long m)//线程休眠进入阻塞状态,可以指定线程休眠的时间
 * yield();功能与sleep()类似,只是不能设置休眠时间,只能进行同优先级间线程的切换
 * join();当前线程可以调用另一个线程的join方法,调用后当前线程会进入阻塞状态,直到被调用的线程执行完毕,当前线程才会执行
 *
 *
 *线程同步，指某一个时刻，指允许一个线程来访问共享资源，线程同步其实是对对象加锁，如果对象中的方法都是同步方法，
 * 那么某一时刻只能执行一个方法，采用线程同步解决以上的问题，
 * 我们只要保证线程一操作 s 时，线程 2 不允许操作即可，只有线程一使用完成 s 后，再让线程二来使用 s 变量
 *
 * 异步编程模型 : t1线程执行t1的,t2线程执行t2的,两个线程之间谁也不等谁.
 * 同步编程模型 : t1线程和t2线程执行,t2线程必须等t1线程执行结束之后,t2线程才能执行,这是同步编程模型.
 * ​
 * 什么时候要用同步呢?为什么要引入线程同步呢?
 * 1.为了数据的安全,尽管应用程序的使用率降低,但是为了保证数据是安全的,必须加入线程同步机制.
 * 线程同步机制使程序变成了(等同)单线程.
 * 2.什么条件下要使用线程同步?
 * 第一: 必须是多线程环境
 * 第二: 多线程环境共享同一个数据.
 * 第三: 共享的数据涉及到修改操作.
 *
 *
 *
 */
public class ThreadTest {
    public static void main(String[] args) {
        //test1();
       //test2();
       // test3();
        //test4();
        test5();
    }

    /**
     * 获取当前线程,给线程取名
     */
    public static void test1(){
        Thread thread = Thread.currentThread();//指向主线程
        System.out.println(thread.getId());
        Thread thread1 = new Thread(new Processor1());
        //给线程取名
        thread1.setName("A");
        thread1.start();
        Thread thread2 = new Thread(new Processor1());
        thread2.setName("B");
        thread2.start();
    }
    /**
     * 给线程设置优先级,线程优先级越高获取cpu时间片要多一些
     * 1-10优先级,1最低,10最高,5默认
     */
    public static void test2(){
        Thread thread1 = new Processor2();
        Thread thread2 = new Processor2();
        //输出线程优先级
        System.out.println(thread1.getPriority()+"::线程1");
        System.out.println(thread2.getPriority()+"::线程2");
        //设置线程优先级
        thread1.setPriority(10);
        thread2.setPriority(1);
        thread1.start();
        thread2.start();
    }
    public static void test3(){
        Thread thread = new Thread(new Processor3());
        thread.start();
        for (int i=0; i<100; i++) {
            System.out.println(Thread.currentThread().getName()+"=====>>"+i);
            try {
                Thread.sleep(1000);//sleep()是静态方法,阻塞当前线程,腾出cup时间片交给其他线程
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    public static void test4(){
        try {
            Thread thread = new Thread(new Processor4());
            thread.start();
            Thread.sleep(5000);//睡5s
            //叫醒thread
            thread.interrupt();//中断睡眠,会抛出异常
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void test5(){
        Processor5 p = new Processor5();
        Thread thread = new Thread(p);
        thread.start();
        try {
            //5s后执行
            Thread.sleep(5000);
            p.isRun = false;
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
